#include "user_config.h"


/* ===================== 全局变量定义 ===================== */

user_config_t g_user_config;


/* ===================== 函数实现 ===================== */

/**
 * @brief  初始化用户配置结构体
 * @param  None
 * @retval None
 */
void user_config_init(void)
{
    // ========== 系统状态初始化(旧) ==========
    g_user_config.system_state = SYS_STATE_INIT;
    g_user_config.manual_mode = 0;

    // ========== UV控制状态机初始化(新) ==========
    g_user_config.uv_state = UV_STATE_INIT;
    g_user_config.uv_current_mode = 0;          // 关闭
    g_user_config.uv_total_work_hours = 0;      // 累计工作时间(小时)
    g_user_config.uv_ignore_flag1 = 0;          // "忽略1"标志位
    g_user_config.uv_ignore_flag2 = 0;          // "忽略2"标志位

    // ========== UV灯初始化(旧,部分保留) ==========
    g_user_config.uv_is_working = 0;
    g_user_config.uv_work_time_sec = 0;
    g_user_config.uv_lifetime_warning = 0;

    // UV定时器初始化(旧,不再使用)
    g_user_config.uv_timer.enable = 0;          // 禁用定时功能
    g_user_config.uv_timer.state = UV_TIMER_IDLE;
    g_user_config.uv_timer.wait_time_sec = UV_TIMER_WAIT_TIME_SEC;
    g_user_config.uv_timer.work_time_sec = UV_TIMER_WORK_TIME_SEC;
    g_user_config.uv_timer.current_timer_sec = 0;

    // ========== 电磁阀初始化 ==========
    g_user_config.valve_is_open = 1;
    // 注意: 电磁阀GPIO在app_valve_control_init()中初始化,此处不重复调用

    // ========== 传感器数据初始化 ==========
    g_user_config.flow_instant = 0.0f;
    g_user_config.flow_total = 0.0f;
    g_user_config.humidity = 30.0f;             // 默认30%湿度(安全值,小于阈值50%)
    g_user_config.temperature = 25;             // 默认25℃
    g_user_config.uv_radiation = 1100;          // UV辐射度初始值(略高于阈值1000,防止误锁定)
    g_user_config.uv_circuit_fault = 0;         // UV电路故障标志

    // ========== 阈值配置初始化(新) ==========
    g_user_config.humidity_threshold = 50;      // 湿度阈值50%
    g_user_config.flow_threshold = 100;         // 流量阈值100 L/H
    g_user_config.uv_value_100 = 1000;          // UV辐射度标准值1000(需校准)

    // ========== 保护与警告初始化 ==========
    g_user_config.leak_detected = 0;
    g_user_config.leak_protect_active = 0;

    // ========== EEPROM管理初始化 ==========
    g_user_config.last_save_time_sec = 0;
    g_user_config.need_save_flag = 0;

    // ========== 按键去抖初始化 ==========
    g_user_config.key_state = 0xFF;             // 假设释放状态为高电平

    // ========== 系统时间初始化 ==========
    g_user_config.system_tick_sec = 0;

    // ========== 从EEPROM加载历史数据 ==========
    // 注意: EEPROM读取功能在 app_eeprom_manage.c 中实现
    // 这里只做初始化,实际加载在 app_eeprom_load_data() 中完成
}


/**
 * @brief  系统时间tick更新 (每1秒调用一次)
 * @param  None
 * @retval None
 * @note   在TIM7定时器中断中调用,用于EEPROM自动保存时间判断
 */
void user_config_tick_1s(void)
{
    g_user_config.system_tick_sec++;
}


/**
 * @brief  按键去抖动读取
 * @param  None
 * @retval 1=按键按下, 0=按键释放
 * @note   需要周期性调用(建议20ms一次)
 */
u8 user_config_read_key_debounced(void)
{
    // 读取按键GPIO状态 (假设低电平有效)
    u8 key_current_state = Read_Manual_Key;

    // 移位寄存器保存历史状态
    g_user_config.key_state = (g_user_config.key_state << 1) | key_current_state;

    // 连续4次读取为低电平(0x00)才认为按键按下
    // 连续4次读取为高电平(0x0F)才认为按键释放
    if ((g_user_config.key_state & 0x0F) == 0x00)
    {
        return 1;  // 按键按下
    }
    else
    {
        return 0;  // 按键释放
    }
}
